From: Tiejun Chen Date: Wed, 22 Jul 2015 01:40:10 +0000 (+0000) Subject: tools: introduce a new parameter to set a predefined rdm boundary X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~2708 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=bc945aa39247df4db334ef92b2aa1b2fcdb6d0ad;p=xen.git tools: introduce a new parameter to set a predefined rdm boundary Previously we always fix that predefined boundary as 2G to handle conflict between memory and rdm, but now this predefined boundar can be changes with the parameter "rdm_mem_boundary" in .cfg file. CC: Ian Jackson CC: Stefano Stabellini CC: Ian Campbell CC: Wei Liu Signed-off-by: Tiejun Chen Acked-by: Wei Liu Acked-by: Ian Jackson Checked-by: Ian Jackson --- diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index e6e0f70a81..ce7ce85acd 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -845,6 +845,28 @@ More information about Xen gfx_passthru feature is available on the XenVGAPassthrough L wiki page. +=item B + +Number of megabytes to set a boundary for checking rdm conflict. + +When RDM conflicts with RAM, RDM probably scatter the whole RAM space. +Especially multiple RDM entries would worsen this to lead a complicated +memory layout. So here we're trying to figure out a simple solution to +avoid breaking existing layout. So when a conflict occurs, + + #1. Above a predefined boundary + - move lowmem_end below reserved region to solve conflict; + + #2. Below a predefined boundary + - Check strict/relaxed policy. + "strict" policy leads to fail libxl. Note when both policies + are specified on a given region, 'strict' is always preferred. + "relaxed" policy issue a warning message and also mask this + entry INVALID to indicate we shouldn't expose this entry to + hvmloader. + +Here the default is 2G. + =item B Specifies the host device tree nodes to passthrough to this guest. Each diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 5a7308d842..927b2d8c73 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -909,6 +909,12 @@ const char *libxl_defbool_to_string(libxl_defbool b); #define LIBXL_TIMER_MODE_DEFAULT -1 #define LIBXL_MEMKB_DEFAULT ~0ULL +/* + * We'd like to set a memory boundary to determine if we need to check + * any overlap with reserved device memory. + */ +#define LIBXL_RDM_MEM_BOUNDARY_MEMKB_DEFAULT (2048 * 1024) + #define LIBXL_MS_VM_GENID_LEN 16 typedef struct { uint8_t bytes[LIBXL_MS_VM_GENID_LEN]; diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 5b5706203f..b27c53a627 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -54,6 +54,10 @@ void libxl__rdm_setdefault(libxl__gc *gc, libxl_domain_build_info *b_info) { if (b_info->u.hvm.rdm.policy == LIBXL_RDM_RESERVE_POLICY_INVALID) b_info->u.hvm.rdm.policy = LIBXL_RDM_RESERVE_POLICY_RELAXED; + + if (b_info->u.hvm.rdm_mem_boundary_memkb == LIBXL_MEMKB_DEFAULT) + b_info->u.hvm.rdm_mem_boundary_memkb = + LIBXL_RDM_MEM_BOUNDARY_MEMKB_DEFAULT; } int libxl__domain_build_info_setdefault(libxl__gc *gc, diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 9af3b210df..0b7c39dbb2 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -930,12 +930,6 @@ int libxl__build_hvm(libxl__gc *gc, uint32_t domid, int ret, rc = ERROR_FAIL; uint64_t mmio_start, lowmem_end, highmem_end; libxl_domain_build_info *const info = &d_config->b_info; - /* - * Currently we fix this as 2G to guarantee how to handle - * our rdm policy. But we'll provide a parameter to set - * this dynamically. - */ - uint64_t rdm_mem_boundary = 0x80000000; memset(&args, 0, sizeof(struct xc_hvm_build_args)); /* The params from the configuration file are in Mb, which are then @@ -974,7 +968,7 @@ int libxl__build_hvm(libxl__gc *gc, uint32_t domid, args.mmio_start = mmio_start; rc = libxl__domain_device_construct_rdm(gc, d_config, - rdm_mem_boundary, + info->u.hvm.rdm_mem_boundary_memkb*1024, &args); if (rc) { LOG(ERROR, "checking reserved device memory failed"); diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 157fa591ac..9caaf442c9 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -503,6 +503,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ ("ms_vm_genid", libxl_ms_vm_genid), ("serial_list", libxl_string_list), ("rdm", libxl_rdm_reserve), + ("rdm_mem_boundary_memkb", MemKB), ])), ("pv", Struct(None, [("kernel", string), ("slack_memkb", MemKB), diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 1d45dd56a8..c567a6a73a 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1583,6 +1583,9 @@ static void parse_config_data(const char *config_source, exit(1); } } + + if (!xlu_cfg_get_long (config, "rdm_mem_boundary", &l, 0)) + b_info->u.hvm.rdm_mem_boundary_memkb = l * 1024; break; case LIBXL_DOMAIN_TYPE_PV: {